package com.pai4j.jianlipai.service.jianlibot;

import com.pai4j.common.enums.PromptTemplateEnum;
import com.pai4j.common.service.FreeMarkEngineService;
import com.pai4j.common.util.AiResponseUtil;
import com.pai4j.common.util.JsonUtil;
import com.pai4j.domain.dto.jianlipai.ResumeDetail;
import com.pai4j.domain.dto.llm.ChatCompletionMessage;
import com.pai4j.domain.dto.llm.ChatCompletionResponse;
import com.pai4j.domain.dto.llm.ChatMessageRole;
import com.pai4j.domain.vo.request.jianlipai.AICreateResumeVO;
import com.pai4j.jianlipai.repository.dao.jianlibot.IJianLiPaiResumeDAO;
import com.pai4j.jianlipai.repository.entity.jianlibot.JianLiPaiResumeEntity;
import com.pai4j.jianlipai.service.MoonshotAIService;
import com.pai4j.jianlipai.service.jianlibot.templates.AbstractTemplateService;
import com.pai4j.jianlipai.service.jianlibot.templates.ResumeTemplateFactory;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * AI 生成简历
 *
 * @author: CYM-pai
 * @date: 2025/05/05 15:09
 **/
@Slf4j
@Service
public class AiGenResumeService {

    @Resource
    private MoonshotAIService moonshotAIService;
    @Resource
    private FreeMarkEngineService freeMarkEngineService;

    @Resource
    private IJianLiPaiResumeDAO jianLiBotResumeDAO;
    /**
     * 使用AI生成简历的方法
     *
     * @param aiCreateResumeVO 包含简历生成所需信息的实体类，包括ID、求职意向和描述等
     * @return 生成的简历HTML字符串
     *
     * 本方法流程：
     * 1. 从输入对象中提取ID、求职意向和描述信息
     * 2. 根据ID查询数据库中的简历实体对象
     * 3. 确保简历实体存在，否则抛出异常
     * 4. 获取简历模板代码
     * 5. 尝试生成简历JSON数据，如果生成失败则重试，最多重试两次
     * 6. 将生成的简历JSON数据转换为ResumeDetail对象
     * 7. 根据模板代码获取相应的模板服务
     * 8. 使用模板服务将简历详情解析为HTML格式并返回
     */
    public ResumeDetail aiGenResume(AICreateResumeVO aiCreateResumeVO) {
        // 提取简历ID、求职意向和描述信息
        String id = aiCreateResumeVO.getId();
        String job = aiCreateResumeVO.getJob();
        String desc = aiCreateResumeVO.getDesc();
        
        // 根据简历ID查询数据库中的简历实体对象
        JianLiPaiResumeEntity jianLiPaiResumeEntity = jianLiBotResumeDAO.findAllByResumeId(id);
        
        // 确保简历实体存在，否则抛出异常
        Assert.isTrue(jianLiPaiResumeEntity != null, "简历不存在！");
        
        // 获取简历模板代码
        String templateCode = jianLiPaiResumeEntity.getTemplateCode();
        
        // 初始化简历详情对象和重试次数
        ResumeDetail resumeDetail = null;
        int retry = 0;
        
        // 尝试生成简历，最多重试两次
        while (retry < 2) {
            try {
                // 生成简历JSON数据
                String resumeJson = aiAutoGenResumeJSON(job, desc, templateCode);
                
                // 确保简历JSON数据不为空，否则抛出异常
                Assert.isTrue(StringUtils.isNotBlank(resumeJson), "简历生成异常！");
                
                // 日志输出简历JSON数据
                log.info("resumeJson====>"+resumeJson);
                
                // 将简历JSON数据转换为ResumeDetail对象
                resumeDetail = JsonUtil.fromJson(resumeJson, ResumeDetail.class);
                
                // 确保简历详情对象不为空，否则抛出异常
                Assert.isTrue(resumeDetail != null, "简历模版数据渲染异常！");
                
                // 日志输出简历详情对象
                log.info("resumeDetail====>"+resumeDetail);
                
                // 成功生成简历，跳出循环
                break;
            } catch (Exception e) {
                // 生成失败，增加重试次数
                ++retry;
            }
        }
        /**
        // 根据模板代码获取相应的模板服务
        AbstractTemplateService abstractTemplateService = ResumeTemplateFactory.getTemplateService(templateCode);
        
        // 使用模板服务将简历详情解析为HTML格式并返回
        return abstractTemplateService.parseHtml(resumeDetail);
         */
        return resumeDetail;
    }
    
    /**
     * 使用AI生成简历的JSON数据
     *
     * @param job     求职意向
     * @param desc    描述
     * @param templateCode 模板代码
     * @return 生成的简历JSON数据
     *
     * 本方法流程：
     * 1. 创建一个Map对象，用于存储模板变量的值
     * 2. 将求职意向和描述添加到Map对象中
     * 3. 获取模板代码对应的模板服务
     * 4. 使用模板服务获取简历JSON模板
     * 5. 创建一个ChatCompletionMessage对象，用于封装系统提示信息
     * 6. 创建一个ChatCompletionMessage对象，用于封装用户输入信息
     * 7. 调用MoonshotAIService的chat方法，传入消息列表，并获取响应
     * 8. 将响应中的内容转换为JSON字符串并返回
     */
    private String aiAutoGenResumeJSON(String job, String desc, String templateCode) {

        AbstractTemplateService abstractTemplateService = ResumeTemplateFactory.getTemplateService(templateCode);

        Map<String, Object> vars = new HashMap<>();
        vars.put("job", job);
        vars.put("desc", desc);
        vars.put("json", abstractTemplateService.getJianLiJsonTemplate());
        try {
            String prompt = freeMarkEngineService.getContentByTemplate(PromptTemplateEnum.AI_GEN_RESUME_JSON.getPath(), vars);
            final List<ChatCompletionMessage> messageList = Arrays.asList(
                    new ChatCompletionMessage(ChatMessageRole.SYSTEM.value(), "你是一个简历文档分析助手"),
                    new ChatCompletionMessage(ChatMessageRole.USER.value(), prompt));
            ChatCompletionResponse chatCompletionResponse = moonshotAIService.chat(messageList);
            return AiResponseUtil.getJsonString(chatCompletionResponse.getChoices().get(0).getMessage().getContent());
        } catch (Exception e) {
            log.error("===>aiAutoComment error.", e);
        }
        return null;
    }
}
